<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  

  
  <title>Dubbo介绍 | 个人博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="Dubbo 学习笔记Dubbo介绍官网参考资料 什么是DubboApache Dubbo是 一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架，可以和Spring框架无缝集成。 Dubbo特性 面向接口代理的高性能RPC调用  智能负载均衡  服务自动注册和发现  高度可扩展能力 SPI  可视化服务治理与运维 Dubbo处理流程   图解：">
<meta property="og:type" content="article">
<meta property="og:title" content="Dubbo介绍">
<meta property="og:url" content="http://codercheng.cn/2020/11/11/Dubbo%E4%BB%8B%E7%BB%8D/index.html">
<meta property="og:site_name" content="个人博客">
<meta property="og:description" content="Dubbo 学习笔记Dubbo介绍官网参考资料 什么是DubboApache Dubbo是 一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架，可以和Spring框架无缝集成。 Dubbo特性 面向接口代理的高性能RPC调用  智能负载均衡  服务自动注册和发现  高度可扩展能力 SPI  可视化服务治理与运维 Dubbo处理流程   图解：">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://gitee.com/adc123321/blog_img/raw/master/image/202011/11/173721-660328.png">
<meta property="og:image" content="https://gitee.com/adc123321/blog_img/raw/master/image/202011/30/170852-510525.png">
<meta property="article:published_time" content="2020-11-11T09:50:21.408Z">
<meta property="article:modified_time" content="2021-03-03T07:41:13.316Z">
<meta property="article:author" content="CoderCheng">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://gitee.com/adc123321/blog_img/raw/master/image/202011/11/173721-660328.png">
  
    <link rel="alternate" href="/atom.xml" title="个人博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.lug.ustc.edu.cn/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  
<link rel="stylesheet" href="/css/style.css">

<meta name="generator" content="Hexo 4.2.1"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">个人博客</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="搜索"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://codercheng.cn"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-Dubbo介绍" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2020/11/11/Dubbo%E4%BB%8B%E7%BB%8D/" class="article-date">
  <time datetime="2020-11-11T09:50:21.408Z" itemprop="datePublished">2020-11-11</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E6%A1%86%E6%9E%B6/">框架</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      Dubbo介绍
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <pre><code>Dubbo 学习笔记</code></pre><h3 id="Dubbo介绍"><a href="#Dubbo介绍" class="headerlink" title="Dubbo介绍"></a>Dubbo介绍</h3><p><a href="http://dubbo.apache.org/zh-cn/docs/2.7/user/preface/background/" target="_blank" rel="noopener">官网参考资料</a></p>
<h2 id="什么是Dubbo"><a href="#什么是Dubbo" class="headerlink" title="什么是Dubbo"></a>什么是Dubbo</h2><p>Apache Dubbo是 一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架，可以和Spring框架无缝集成。</p>
<h3 id="Dubbo特性"><a href="#Dubbo特性" class="headerlink" title="Dubbo特性"></a>Dubbo特性</h3><ul>
<li><p>面向接口代理的高性能RPC调用</p>
</li>
<li><p>智能负载均衡</p>
</li>
<li><p>服务自动注册和发现</p>
</li>
<li><p>高度可扩展能力 SPI</p>
</li>
<li><p>可视化服务治理与运维</p>
<h3 id="Dubbo处理流程"><a href="#Dubbo处理流程" class="headerlink" title="Dubbo处理流程"></a>Dubbo处理流程</h3></li>
</ul>
<p><img src="https://gitee.com/adc123321/blog_img/raw/master/image/202011/11/173721-660328.png" alt="下载"></p>
<p>图解：</p>
<table>
<thead>
<tr>
<th>节点</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>Provider</td>
<td>服务提供者</td>
</tr>
<tr>
<td>Consumer</td>
<td>服务消费者</td>
</tr>
<tr>
<td>Registry</td>
<td>服务注册与发现的注册中心</td>
</tr>
<tr>
<td>Monitor</td>
<td>监控中心，统计服务调用次数调用时间</td>
</tr>
<tr>
<td>Container</td>
<td>服务运行容器，负责启动加载运行生产者</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th>线条</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>蓝色虚线</td>
<td>服务启动后的初始化过程</td>
</tr>
<tr>
<td>红色虚线</td>
<td>异步过程</td>
</tr>
<tr>
<td>红色实现</td>
<td>同步调用过程</td>
</tr>
</tbody></table>
<h2 id="Dubbo高级进阶"><a href="#Dubbo高级进阶" class="headerlink" title="Dubbo高级进阶"></a>Dubbo高级进阶</h2><h3 id="扩展点配置-SPI"><a href="#扩展点配置-SPI" class="headerlink" title="扩展点配置 SPI"></a>扩展点配置 SPI</h3><p>SPI 全称为 (Service Provider Interface) ，是JDK内置的一种服务提供发现机制。</p>
<p>目前有不少框架用它来做服务的扩展发现，简单来说，它就是一种动态替换发现的机制。</p>
<p>使用SPI机制的优势是实现解耦，使得第三方服务模块的装配控制逻辑与调用者的业务代码分离。</p>
<p><img src="https://gitee.com/adc123321/blog_img/raw/master/image/202011/30/170852-510525.png" alt="JDK-SPI"></p>
<p>Java中如果想要使用SPI功能，先提供标准服务接口，然后再提供相关接口实现和调用者。这样就可以通过SPI机制中约定好的信息进行查询相应的接口实现。</p>
<p>SPI遵循如下约定:</p>
<ol>
<li><p>当服务提供者提供了接口的一种具体实现后，在META-INF/services目录下创建一个以“接口全限定名”为命名的文件，内容为实现类的全限定名;</p>
</li>
<li><p>接口实现类所在的jar包放在主程序的classpath中;</p>
</li>
<li><p>主程序通过java.util.ServiceLoader动态装载实现模块。</p>
<p>它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名，把类加载到JVM;</p>
</li>
<li><p>SPI的实现类必须携带一个无参构造方法</p>
</li>
</ol>
<h4 id="扩展点-Dubbo中的SPI"><a href="#扩展点-Dubbo中的SPI" class="headerlink" title="扩展点-Dubbo中的SPI"></a>扩展点-Dubbo中的SPI</h4><h5 id="来源"><a href="#来源" class="headerlink" title="来源"></a>来源</h5><p>Dubbo 的扩展点加载从 JDK 标准的 SPI (Service Provider Interface) 扩展点发现机制加强而来。</p>
<p>Dubbo 改进了 JDK 标准的 SPI 的以下问题：</p>
<ul>
<li>JDK 标准的 SPI 会<strong>一次性实例化扩展点所有实现</strong>，如果有扩展实现初始化很耗时，但如果没用上也加载，会很浪费资源。</li>
<li>如果扩展点加载失败，连扩展点的名称都拿不到了。比如：JDK 标准的 ScriptEngine，通过<code>getName()</code> 获取脚本类型的名称，但如果 RubyScriptEngine 因为所依赖的 jruby.jar 不存在，导致 RubyScriptEngine 类加载失败，这个失败原因被吃掉了，和 ruby 对应不起来，当用户执行 ruby 脚本时，会报不支持 ruby，而不是真正失败的原因。</li>
<li>增加了对扩展点 IoC 和 AOP 的支持，一个扩展点可以直接 setter 注入其它扩展点。</li>
</ul>
<h5 id="约定"><a href="#约定" class="headerlink" title="约定"></a>约定</h5><ol>
<li>当服务提供者提供了接口的一种具体实现后，在`META-INF/dubbo/目录下创建一个以“接口全限定名”为命名的文件，内容为实现类的全限定名</li>
<li>内容为：<code>配置名=扩展实现类全限定名</code>，多个实现类用换行符分隔</li>
</ol>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://codercheng.cn/2020/11/11/Dubbo%E4%BB%8B%E7%BB%8D/" data-id="cko3snvwb0005i8uo4t3vdp93" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2020/11/27/SpringCloud%20%E4%BD%9C%E4%B8%9A%E7%BC%96%E7%A8%8B%E9%A2%98/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          SpringCloud 作业编程题
        
      </div>
    </a>
  
  
    <a href="/2020/11/11/Dubbo%E4%B9%A0%E9%A2%98%E8%AF%B4%E6%98%8E/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">Dubbo习题说明</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">分类</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/Java/">Java</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/MySql/">MySql</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Netty/">Netty</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringBoot/">SpringBoot</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringCloud/">SpringCloud</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringMVC/">SpringMVC</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Tomcat/">Tomcat</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Zookeeper/">Zookeeper</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E4%BD%9C%E4%B8%9A/">作业</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%88%86%E5%B8%83%E5%BC%8F%E8%B0%83%E5%BA%A6/">分布式调度</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%A1%86%E6%9E%B6/">框架</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%9F%A5%E8%AF%86/">知识</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">设计模式</a></li></ul>
    </div>
  </div>


  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">归档</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2024/08/">八月 2024</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/09/">九月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/08/">八月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/04/">四月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/02/">二月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/11/">十一月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/06/">六月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/05/">五月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/04/">四月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/03/">三月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/02/">二月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/01/">一月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/12/">十二月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/11/">十一月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/10/">十月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/09/">九月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/08/">八月 2020</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2024/08/28/CentOS%E5%86%85%E5%AD%98cpu%E6%8E%92%E6%9F%A5/">CentOS内存cpu排查</a>
          </li>
        
          <li>
            <a href="/2022/09/22/Linux%20%E6%9F%A5%E7%9C%8B%E6%97%A5%E5%BF%97%E5%91%BD%E4%BB%A4/">Linux 查看日志命令</a>
          </li>
        
          <li>
            <a href="/2022/08/30/dubbo%20%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/">dubbo 常见问题</a>
          </li>
        
          <li>
            <a href="/2022/04/26/1%20%E6%BA%90%E7%A0%81%E7%AC%94%E8%AE%B0/">1 源码笔记</a>
          </li>
        
          <li>
            <a href="/2022/02/24/jvisualVM%20%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0/">jvisualVM 使用笔记</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2024 CoderCheng<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//code.jquery.com/jquery-2.0.3.min.js"></script>


  
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css">

  
<script src="/fancybox/jquery.fancybox.pack.js"></script>




<script src="/js/script.js"></script>




  </div>
</body>
</html>